package biz_struct

import (
	"fmt"
	"sort"
)

// HeroKind 英雄种类
type HeroKind int

// Hero 英雄结构体体定义
type Hero struct {
	Name string
	Kind HeroKind
}

// HeroKind 英雄种类枚举 iota 会从 0开始时给后续赋值
const (
	None HeroKind = iota
	Tank
	Assassin
	Mage
)

// Heros 定义一个全英雄数组类型
type Heros []*Hero

// Len 实现排序接口
func (heros Heros) Len() int {
	return len(heros)
}

// Less 实现排序接口
func (heros Heros) Less(i, j int) bool {
	// 先按分类排序
	if heros[i].Kind != heros[j].Kind {
		return heros[i].Kind < heros[j].Kind
	}
	// 再按名称分类
	return heros[i].Name < heros[j].Name
}

// Swap 实现排序接口
func (heros Heros) Swap(i, j int) {
	heros[i], heros[j] = heros[j], heros[i]
}

func SortHerosDemo() {
	// 准备英雄列表
	heros := Heros{
		&Hero{"吕布", Tank},
		&Hero{"李白", Assassin},
		&Hero{"妲己", Mage},
		&Hero{"貂蝉", Assassin},
		&Hero{"关羽", Tank},
		&Hero{"诸葛亮", Mage},
	}
	fmt.Println("sort.Sort排序前===>")
	for i, hero := range heros {
		fmt.Println("下标i=", i, "对象hero=", hero)
	}
	fmt.Println("sort.Sort排序后===>")
	sort.Sort(heros)
	for i, hero := range heros {
		fmt.Println("下标i=", i, "对象hero=", hero)
	}
}

func SortHerosDemoA() {
	// 准备英雄列表
	heros := Heros{
		&Hero{"吕布", Tank},
		&Hero{"李白", Assassin},
		&Hero{"妲己", Mage},
		&Hero{"貂蝉", Assassin},
		&Hero{"关羽", Tank},
		&Hero{"诸葛亮", Mage},
	}
	fmt.Println("sort.Slice 排序前===>")
	for i, hero := range heros {
		fmt.Println("下标i=", i, "对象hero=", hero)
	}
	fmt.Println("sort.Slice 排序后===>")

	// 更简单的排序，只需传入 排序对象和一个匿名排序函数
	sort.Slice(heros, func(i, j int) bool {
		// 先按分类排序
		if heros[i].Kind != heros[j].Kind {
			return heros[i].Kind < heros[j].Kind
		}
		// 再按名称分类
		return heros[i].Name < heros[j].Name
	})

	for i, hero := range heros {
		fmt.Println("下标i=", i, "对象hero=", hero)
	}
}
